AddressSanitizer (ASan) 是一種編譯器和執行時間技術,會以 零 誤報來公開許多難以發現的 bug:
從 Visual Studio 2019 16.9 版開始,Microsoft C/c + + 編譯器 (MSVC) 和 IDE 支援AddressSanitizer
先根據官網提供的source code建立一個CPP檔案
// basic-global-overflow.cpp
#include <stdio.h>
int x[100];
int main() {
#ifdef __SANITIZE_ADDRESS__
printf("Address sanitizer enabled\n");
#else
printf("Address sanitizer not enabled\n");
#endif
printf("Hello!\n");
x[100] = 5; // Boom!
return 0;
}
設定ASan
專案屬性 → C/C++ → 一般 → 啟用[ASan] 選擇是
MSVS的 AddressSanitizer 已知問題 有開啟ASan還需進行一些設定,才能正常使用
我的環境需要將 偵錯資訊格式 設定成 無,才可以正常使用
F5執行後顯示錯誤訊息
0x007a9350 is located 0 bytes to the right of global variable 'x' defined in 'main.cpp:3:4' (0x7a91c0) of size 400
這邊顯示顯示錯誤的地方
#0 0x7a1081 in main+0x61 (D:\temp\stdThreadPrj\Debug\stdThreadPrj.exe+0x401081)
這個部分可以參考 使用visual studio trace call stack的private function 來找到錯誤的位置
reference
[1] AddressSanitizer | Microsoft Docs